Análisis de PM10, Temperatura Ambiente, Humedad Relativa y Ozono de estación Compartir

Análisis de PM10, Temperatura Ambiente, Humedad Relativa y Ozono de estación Compartir#




Importación de Librerías

# Load libraries
import seaborn as sns
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# Load sklearn
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import GridSearchCV
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import Lasso
from sklearn.linear_model import ElasticNet
from sklearn.tree import DecisionTreeRegressor
from sklearn.neighbors import KNeighborsRegressor
from sklearn.svm import SVR
from sklearn.pipeline import Pipeline
from sklearn.ensemble import RandomForestRegressor
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.ensemble import ExtraTreesRegressor
from sklearn.ensemble import AdaBoostRegressor
from sklearn.metrics import mean_squared_error

import warnings
warnings.filterwarnings("ignore")

A continuación usamos la función read_cvs() de la libreria pandaspara cargar los datos a nuestro entorno de trabajo.

df = pd.read_csv("data_2017_2022.csv", sep=";")
df_1 = df.copy()
df_1["medicion"]=df_1["medicion"].str.replace(",", ".").astype("float") # convertir variable medición a númerica
df_1['fecha'] = pd.to_datetime(df_1['fecha']) # convertir variable fecha a datatime
df_1 = df_1.pivot(index=["fecha", "estacion"],columns= "variable", values="medicion").reset_index()
df_1.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 473256 entries, 0 to 473255
Data columns (total 18 columns):
 #   Column            Non-Null Count   Dtype              
---  ------            --------------   -----              
 0   fecha             473256 non-null  datetime64[ns, UTC]
 1   estacion          473256 non-null  object             
 2   black_carbon      8620 non-null    float64            
 3   direccion_viento  204419 non-null  float64            
 4   h2s               15353 non-null   float64            
 5   humedad           230887 non-null  float64            
 6   lluvia            260671 non-null  float64            
 7   no2               1 non-null       float64            
 8   o3                201936 non-null  float64            
 9   pm10              234568 non-null  float64            
 10  pm25              174546 non-null  float64            
 11  presion           209181 non-null  float64            
 12  radiacion_solar   221284 non-null  float64            
 13  so2               132180 non-null  float64            
 14  temperatura       267206 non-null  float64            
 15  temperatura_10_m  13746 non-null   float64            
 16  uv-pm             8620 non-null    float64            
 17  velocidad_viento  205405 non-null  float64            
dtypes: datetime64[ns, UTC](1), float64(16), object(1)
memory usage: 65.0+ MB

Para más practicidad se renombran las variables de nuestro conjunto de datos.

df_1 = df_1.rename(columns={    
    'variable': 'var',
    'black_carbon': 'BC',
    'direccion_viento': 'WD',
    'humedad': 'HR',
    'lluvia': 'RF',
    'presion': 'P',
    'radiacion_solar': 'RS',
    'temperatura': 'AT',
    'temperatura_10_m': 'AT_10_m',
    'uv-pm': 'UV',
    'velocidad_viento': 'WS',
    'h2s': 'H2S',
    'no2': 'NO2',
    'o3': 'O3',
    'so2': 'SO2',
    'pm10': 'PM10',
    'pm25': 'PM2.5'  
})

Dado que la variable la variable \(\text{NO}_2\) tiene solo \(1\) medición entre \(473.256\) registros durante el periodo analizado, lo que representa casi un \(100\%\) de datos faltantes, hemos optado por excluirla del análisis.

df_t = df_1.copy()
df_t = df_t.drop(columns=["NO2"])

A continuación visualizamos los datos correspondientes a la estación Compartira tráves de la función head()

df_compartir = df_t[df_t['estacion'] == 'compartir']
df_compartir.head()
variable fecha estacion BC WD H2S HR RF O3 PM10 PM2.5 P RS SO2 AT AT_10_m UV WS
2 2017-01-01 00:59:59+00:00 compartir NaN 208.6 NaN 75.9 0.0 8.456252 221.0 161.0 680.5 0.0 NaN 25.3 NaN NaN 1.4
11 2017-01-01 01:59:59+00:00 compartir NaN 65.2 NaN 77.3 0.0 8.240431 229.0 147.0 680.0 0.0 NaN 25.0 NaN NaN 0.8
20 2017-01-01 02:59:59+00:00 compartir NaN 86.8 NaN 77.6 0.0 6.651205 136.0 78.0 679.5 0.0 NaN 24.6 NaN NaN 1.4
29 2017-01-01 03:59:59+00:00 compartir NaN 216.0 NaN 79.2 0.0 5.984123 101.0 46.0 679.5 0.0 NaN 24.1 NaN NaN 1.5
38 2017-01-01 04:59:59+00:00 compartir NaN 271.8 NaN 79.9 0.0 6.513865 90.0 54.0 679.8 0.0 NaN 24.1 NaN NaN 1.9
df_base_aerea = df_t[df_t['estacion'] == 'base_aerea']
df_canaveralejo = df_t[df_t['estacion'] == 'canaveralejo']
df_era_obrero = df_t[df_t['estacion'] == 'era_obrero']
df_ermita = df_t[df_t['estacion'] == 'ermita']
df_flora = df_t[df_t['estacion'] == 'flora']
df_pance = df_t[df_t['estacion'] == 'pance']
df_transitoria = df_t[df_t['estacion'] == 'transitoria']
df_univalle = df_t[df_t['estacion'] == 'univalle']

Material Particulado de 10\(\mu m\) (PM10) #

import plotly.graph_objects as go
import pandas as pd

df_compartir['fecha'] = pd.to_datetime(df_compartir['fecha'])

# Crear la figura usando plotly.graph_objects
fig = go.Figure()

# Añadir la traza de la línea
fig.add_trace(go.Scatter(
    x=df_compartir['fecha'],
    y=df_compartir['PM10'],
    mode='lines',  # Mostrar la línea
    line=dict(color='#30143F', width=2),  # Cambiar el color de la línea y el ancho
    name='PM10 (µg/m³)',
    opacity=0.7  # Ajustar la opacidad de la línea (0.0 es completamente transparente, 1.0 es completamente opaco)
))

# Ajustar el diseño del gráfico
fig.update_layout(
    title='PM10 a lo Largo del Tiempo',
    xaxis_title='Fecha',
    yaxis_title='PM10 (µg/m³)',  
    xaxis=dict(tickangle=45, tickformat='%Y-%m-%d'),  # Rotar etiquetas del eje X y formato de fecha
    yaxis=dict(tickformat='.1f'),  # Formato de los ticks del eje Y (un decimal)
    template='plotly_white',  # Fondo blanco 
    title_x=0.5,  # Centrar el título
    title_font=dict(size=16)  # Ajusta el tamaño de la fuente del título
)

fig.show()
import plotly.express as px
import plotly.graph_objects as go

# Gráfico de densidad interactivo usando Plotly Express
fig_density = px.histogram(df_compartir, x="PM10", marginal="box", nbins=50, title="Densidad de PM10 Estación Compartir",
                           labels={'PM10': 'PM10 (µg/m³)'}, color_discrete_sequence=['#30143F'])


fig_density.update_traces(
    marker=dict(color='#30143F', opacity=0.7),  # Ajustar la opacidad de las barras
    selector=dict(type='histogram')
)

# Ajustar el diseño del gráfico de densidad
fig_density.update_layout(
    xaxis_title="PM10 (µg/m³)",
    yaxis_title="Frecuencia",
    showlegend=False
)

fig_density.show()
import plotly.graph_objects as go
import pandas as pd


df_compartir['fecha'] = pd.to_datetime(df_compartir['fecha'])

# Crear la columna 'Año' basada en 'fecha'
df_compartir['Año'] = df_compartir['fecha'].dt.year

# Crear una lista única de años para el eje x después de crear la columna 'Año'
años = sorted(df_compartir['Año'].unique())

# Definir los colores para cada año
colores_años = ['#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f', '#d98e31', 
                '#e69c24', '#f2aa1c', '#f5b512', '#f8b902', '#f8b902', '#f8b902'] 


figbox = go.Figure()

# Añadir trazas manualmente para cada año con colores específicos
for i, año in enumerate(años):
    df_subset = df_compartir[df_compartir['Año'] == año]
    figbox.add_trace(go.Box(
        y=df_subset['PM10'],
        name=str(año),
        marker_color=colores_años[i % len(colores_años)]  # Asignar un color específico a cada año
    ))

figbox.update_layout(
    title="Distribución de PM10 por Año",
    xaxis_title="Año",
    yaxis_title="PM10 (µg/m³)",
    title_x=0.5,  # Centrar el título
    xaxis=dict(
        title="Año",
        tickmode='array',
        tickvals=años,  
        ticktext=[str(año) for año in años]  # Etiquetas para cada año
    )
)

# Mostrar el gráfico interactivo
figbox.show()
import plotly.graph_objects as go
import pandas as pd

# Definir el orden correcto de los meses en español
orden_meses = ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio",
               "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"]

# Crear un diccionario para mapear números de mes a nombres en español
nombres_meses = {i+1: mes for i, mes in enumerate(orden_meses)}

# Crear un diccionario para mapear nombres de mes a números
mes_a_numero = {mes: i+1 for i, mes in enumerate(orden_meses)}

# Definir una lista de colores para los meses
colores_meses = ['#30143F', '#432c4d', '#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f', '#d98e31', '#e69c24', '#f2aa1c', '#f5b512', '#f8b902']

# Crear una columna adicional para el mes basado en la fecha
df_compartir['Mes'] = df_compartir['fecha'].dt.month.map(nombres_meses)

# Mapear los nombres de los meses a números para ordenar
df_compartir['Mes_Num'] = df_compartir['Mes'].map(mes_a_numero)


figbox = go.Figure()

# Añadir trazas para cada mes con colores distintos
for mes, color in zip(orden_meses, colores_meses):
    df_subset = df_compartir[df_compartir['Mes'] == mes]
    figbox.add_trace(go.Box(
        y=df_subset['PM10'],
        name=mes,
        marker_color=color
    ))

# Actualizar el diseño del gráfico
figbox.update_layout(
    title="Distribución de PM10 Mensual",
    xaxis_title="Mes",
    yaxis_title="PM10 (µg/m³)",
    title_x=0.5,  # Centrar el título
    xaxis=dict(
        tickmode='array',
        tickvals=orden_meses,  
        ticktext=orden_meses,  
        categoryorder='array',  # Ordenar los meses en el orden especificado
        categoryarray=orden_meses  # Especificar el orden de los meses
    )
)

# Mostrar el gráfico interactivo
figbox.show()
import plotly.graph_objects as go
import pandas as pd

# Definir el orden correcto de los días de la semana en español
orden_dias = ["Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo"]

# Crear un diccionario para mapear números de día de la semana a nombres en español
nombres_dias = {i: dia for i, dia in enumerate(orden_dias, start=0)}

# Crear un diccionario para mapear nombres de días a números
dia_a_numero = {dia: i for i, dia in enumerate(orden_dias)}

# Definir una lista de colores para los días de la semana
colores_dias = ['#30143F', '#432c4d', '#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f']


# Crear una columna adicional para el día de la semana basado en la fecha
df_compartir['Día'] = df_compartir['fecha'].dt.day_name().map(lambda x: {
    'Monday': 'Lunes', 'Tuesday': 'Martes', 'Wednesday': 'Miércoles',
    'Thursday': 'Jueves', 'Friday': 'Viernes', 'Saturday': 'Sábado', 'Sunday': 'Domingo'
}[x])

# Mapear los nombres de los días a números para ordenar
df_compartir['Día_Num'] = df_compartir['Día'].map(dia_a_numero)


figbox = go.Figure()

# Añadir trazas para cada día de la semana con colores distintos
for dia, color in zip(orden_dias, colores_dias):
    df_subset = df_compartir[df_compartir['Día'] == dia]
    figbox.add_trace(go.Box(
        y=df_subset['PM10'],
        name=dia,
        marker_color=color
    ))

# Actualizar el diseño del gráfico
figbox.update_layout(
    title="Distribución PM10 por Día de la Semana",
    xaxis_title="Día de la Semana",
    yaxis_title="PM10 (µg/m³)",
    title_x=0.5,  # Centrar el título
    xaxis=dict(
        tickmode='array',
        tickvals=orden_dias,  
        ticktext=orden_dias,  
        categoryorder='array',  # Ordenar los días en el orden especificado
        categoryarray=orden_dias  # Especificar el orden de los días de la semana
    )
)

# Mostrar el gráfico interactivo
figbox.show()
import plotly.graph_objects as go
import pandas as pd

# Definir el orden correcto de las horas del día
orden_horas = [f"{i:02d}:00" for i in range(24)]

# Crear un diccionario para mapear números de hora a nombres
horas_a_numero = {f"{i:02d}:00": i for i in range(24)}

# Definir una lista de colores para las horas del día
colores_horas = ['#30143F', '#432c4d', '#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f', 
                 '#d98e31', '#e69c24', '#f2aa1c', '#f5b512', '#f8b902', '#f8d024', '#f4c433', 
                 '#f0b838', '#d8a73d', '#c09d42', '#a9914f', '#8c8e5a', '#6d8a65', '#51776c', 
                 '#356d6f', '#1e616c', '#115f6a', '#006f6f']



# Crear una columna adicional para la hora basada en la fecha
df_compartir['Hora'] = df_compartir['fecha'].dt.hour.map(lambda x: f"{x:02d}:00")

# Mapear las horas a números para ordenar
df_compartir['Hora_Num'] = df_compartir['Hora'].map(horas_a_numero)


figbox = go.Figure()

# Añadir trazas para cada hora con colores distintos
for hora, color in zip(orden_horas, colores_horas):
    df_subset = df_compartir[df_compartir['Hora'] == hora]
    figbox.add_trace(go.Box(
        y=df_subset['PM10'],
        name=hora,
        marker_color=color
    ))

# Actualizar el diseño del gráfico
figbox.update_layout(
    title="Distribución de PM10 por Hora del Día",
    xaxis_title="Hora del Día",
    yaxis_title="PM10 (µg/m³)",
    title_x=0.5,  # Centrar el título
    xaxis=dict(
        tickmode='array',
        tickvals=orden_horas,
        ticktext=orden_horas,  
        categoryorder='array',  # Ordenar las horas en el orden especificado
        categoryarray=orden_horas  # Especificar el orden de las horas
    )
)


figbox.show()

En relación con los gráficos analizados, se observa una tendencia consistente en la concentración de PM10 (µg/m³) al segmentar los datos por año, mes y día de la semana. Sin embargo, al examinar las horas del día, se identifica que entre las 4 y 9 a.m., la mediana de PM10 muestra un incremento comparado con otras horas, con una mayor dispersión en los datos entre las 6 y 7 a.m. Esto sugiere la posible presencia de eventos que elevan los niveles de PM10 durante la mañana. A partir de las 10 a.m., los valores de PM10 muestran una leve disminución, manteniéndose relativamente constantes hasta aproximadamente las 5 p.m. A partir de las 6 p.m. hasta las 9 p.m., se observa un ligero aumento en los niveles de PM10.

Temperatura Ambiente (AT) #

import plotly.graph_objects as go
import pandas as pd


fig = go.Figure()


fig.add_trace(go.Scatter(
    x=df_compartir['fecha'],
    y=df_compartir['AT'],
    mode='lines',  # Mostrar la línea
    line=dict(color='#30143F'),  # Cambiar el color de la línea
    name='Temperatura Ambiente (°C)',
    opacity=0.7  # Ajustar la opacidad de la línea (0.0 es completamente transparente, 1.0 es completamente opaco)
))


fig.update_layout(
    title='Temperatura Ambiente a lo Largo del Tiempo',
    xaxis_title='Fecha',
    yaxis_title='Temperatura Ambiente (°C)', 
    xaxis=dict(tickangle=45, tickformat='%Y-%m-%d'),  # Rotar etiquetas del eje X y formato de fecha
    yaxis=dict(tickformat='.1f'),  # Formato  del eje Y (un decimal)
    template='plotly_white',  # Fondo blanco
    title_x=0.5,  # Centrar el título
    title_font=dict(size=16)  # Ajustar el tamaño de la fuente del título
)

# Mostrar el gráfico interactivo
fig.show()
import plotly.express as px
import plotly.graph_objects as go

fig_density = px.histogram(df_compartir, x="AT", marginal="box", nbins=50, title="Densidad de Temperatura Ambiente Estación Compartir",
                           labels={'Temperatura Ambiente (°C)'}, color_discrete_sequence=['#30143F'])


fig_density.update_traces(
    marker=dict(color='#30143F', opacity=0.7),  # Ajustar la opacidad de las barras
    selector=dict(type='histogram')
)


fig_density.update_layout(
    xaxis_title="'Temperatura Ambiente (°C)'",
    yaxis_title="Frecuencia",
    showlegend=False
)

fig_density.show()
import plotly.graph_objects as go
import pandas as pd

# Crear una lista única de años para el eje x
años = sorted(df_compartir['Año'].unique())

# Definir los colores para cada año
colores_años = ['#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f', '#d98e31', 
                '#e69c24', '#f2aa1c', '#f5b512', '#f8b902', '#f8b902', '#f8b902'] 


figbox = go.Figure()

# Añadir trazas manualmente para cada año con colores específicos
for i, año in enumerate(años):
    df_subset = df_compartir[df_compartir['Año'] == año]
    figbox.add_trace(go.Box(
        y=df_subset['AT'],
        name=str(año),
        marker_color=colores_años[i % len(colores_años)]  # Asignar un color específico a cada año
    ))


figbox.update_layout(
    title="Distribución de Temperatura Ambiente por Año",
    xaxis_title="Año",
    yaxis_title="Temperatura Ambiente (°C)",
    title_x=0.5,  # Centrar el título
    xaxis=dict(
        title="Año",
        tickmode='array',
        tickvals=años,  # Asegurar que todos los años se muestran
        ticktext=[str(año) for año in años]  # Etiquetas para cada año
    )
)


figbox.show()
import plotly.graph_objects as go
import pandas as pd

# Definir el orden correcto de los meses en español
orden_meses = ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio",
               "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"]

# Crear un diccionario para mapear números de mes a nombres en español
nombres_meses = {i+1: mes for i, mes in enumerate(orden_meses)}

# Crear un diccionario para mapear nombres de mes a números
mes_a_numero = {mes: i+1 for i, mes in enumerate(orden_meses)}

# Definir una lista de colores para los meses
colores_meses = ['#30143F', '#432c4d', '#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f', '#d98e31', '#e69c24', '#f2aa1c', '#f5b512', '#f8b902']




# Crear una columna adicional para el mes basado en la fecha
df_compartir['Mes'] = df_compartir['fecha'].dt.month.map(nombres_meses)

# Mapear los nombres de los meses a números para ordenar
df_compartir['Mes_Num'] = df_compartir['Mes'].map(mes_a_numero)


figbox = go.Figure()

# Añadir trazas para cada mes con colores distintos
for mes, color in zip(orden_meses, colores_meses):
    df_subset = df_compartir[df_compartir['Mes'] == mes]
    figbox.add_trace(go.Box(
        y=df_subset['AT'],
        name=mes,
        marker_color=color
    ))


figbox.update_layout(
    title="Distribución de Temperatura Ambiente Mensual",
    xaxis_title="Mes",
    yaxis_title="Temperatura Ambiente (°C)",
    title_x=0.5,  # Centrar el título
    xaxis=dict(
        tickmode='array',
        tickvals=orden_meses,  
        ticktext=orden_meses, 
        categoryorder='array',  # Ordenar los meses en el orden especificado
        categoryarray=orden_meses  # Especificar el orden de los meses
    )
)


figbox.show()
import plotly.graph_objects as go
import pandas as pd

# Definir el orden correcto de los días de la semana en español
orden_dias = ["Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo"]

# Crear un diccionario para mapear números de día de la semana a nombres en español
nombres_dias = {i: dia for i, dia in enumerate(orden_dias, start=0)}

# Crear un diccionario para mapear nombres de días a números
dia_a_numero = {dia: i for i, dia in enumerate(orden_dias)}

# Definir una lista de colores para los días de la semana
colores_dias = ['#30143F', '#432c4d', '#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f']


# Crear una columna adicional para el día de la semana basado en la fecha
df_compartir['Día'] = df_compartir['fecha'].dt.day_name().map(lambda x: {
    'Monday': 'Lunes', 'Tuesday': 'Martes', 'Wednesday': 'Miércoles',
    'Thursday': 'Jueves', 'Friday': 'Viernes', 'Saturday': 'Sábado', 'Sunday': 'Domingo'
}[x])

# Mapear los nombres de los días a números para ordenar
df_compartir['Día_Num'] = df_compartir['Día'].map(dia_a_numero)


figbox = go.Figure()

# Añadir trazas para cada día de la semana con colores distintos
for dia, color in zip(orden_dias, colores_dias):
    df_subset = df_compartir[df_compartir['Día'] == dia]
    figbox.add_trace(go.Box(
        y=df_subset['AT'],
        name=dia,
        marker_color=color
    ))


figbox.update_layout(
    title="Distribución  Temperatura Ambiente por Día de la Semana",
    xaxis_title="Día de la Semana",
    yaxis_title="Temperatura Ambiente (°C)",
    title_x=0.5,  # Centrar el título
    xaxis=dict(
        tickmode='array',
        tickvals=orden_dias,  
        ticktext=orden_dias,  
        categoryorder='array',  # Ordenar los días en el orden especificado
        categoryarray=orden_dias  # Especificar el orden de los días de la semana
    )
)

figbox.show()
import plotly.graph_objects as go
import pandas as pd

# Definir el orden correcto de las horas del día
orden_horas = [f"{i:02d}:00" for i in range(24)]

# Crear un diccionario para mapear números de hora a nombres
horas_a_numero = {f"{i:02d}:00": i for i in range(24)}

# Definir una lista de colores para las horas del día
colores_horas = ['#30143F', '#432c4d', '#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f', 
                 '#d98e31', '#e69c24', '#f2aa1c', '#f5b512', '#f8b902', '#f8d024', '#f4c433', 
                 '#f0b838', '#d8a73d', '#c09d42', '#a9914f', '#8c8e5a', '#6d8a65', '#51776c', 
                 '#356d6f', '#1e616c', '#115f6a', '#006f6f']



# Crear una columna adicional para la hora basada en la fecha
df_compartir['Hora'] = df_compartir['fecha'].dt.hour.map(lambda x: f"{x:02d}:00")

# Mapear las horas a números para ordenar
df_compartir['Hora_Num'] = df_compartir['Hora'].map(horas_a_numero)

# Crear una figura usando plotly.graph_objects
figbox = go.Figure()

# Añadir trazas para cada hora con colores distintos
for hora, color in zip(orden_horas, colores_horas):
    df_subset = df_compartir[df_compartir['Hora'] == hora]
    figbox.add_trace(go.Box(
        y=df_subset['AT'],
        name=hora,
        marker_color=color
    ))


figbox.update_layout(
    title="Distribución de Temperatura Ambiente por Hora del Día",
    xaxis_title="Hora del Día",
    yaxis_title="Temperatura Ambiente (°C)",
    title_x=0.5,  # Centrar el título
    xaxis=dict(
        tickmode='array',
        tickvals=orden_horas, 
        ticktext=orden_horas,
        categoryorder='array',  # Ordenar las horas en el orden especificado
        categoryarray=orden_horas  # Especificar el orden de las horas
    )
)


figbox.show()

En relación con los gráficos analizados, se observa una tendencia consistente en la temperatura ambiente (°C) al segmentar los datos por año, mes y día de la semana. Sin embargo, al examinar las horas del día, se identifica que entre las 7 a.m. y 2 p.m., la mediana de temperatura ambiente muestra un incremento comparado con otras horas, con una mayor dispersión en los datos entre las 8 a.m y 2 p.m. A partir de las 3 p.m., la temperatura ambiente muestran una leve disminución hasta las 9 p.m., posterior a ésta hora la temperatura se mantiene relativamente constantes hasta aproximadamente las 6 a.m. del siguiente día.

Humedad Relativa (HR) #

import plotly.graph_objects as go
import pandas as pd


fig = go.Figure()

# Añadir la traza de la línea
fig.add_trace(go.Scatter(
    x=df_compartir['fecha'],
    y=df_compartir['HR'],
    mode='lines',  # Mostrar la línea
    line=dict(color='#30143F'),  # Cambiar el color de la línea
    name='Humedad Relativa (%)',
    opacity=0.7  # Ajustar la opacidad de la línea (0.0 es completamente transparente, 1.0 es completamente opaco)
))


fig.update_layout(
    title='Humedad Relativa a lo Largo del Tiempo',
    xaxis_title='Fecha',
    yaxis_title='Humedad Relativa (%)',  
    xaxis=dict(tickangle=45, tickformat='%Y-%m-%d'),  
    yaxis=dict(tickformat='.1f'),  # Formato de los ticks del eje Y (un decimal)
    template='plotly_white',  # Fondo blanco 
    title_x=0.5,  # Centrar el título
    title_font=dict(size=16)  # Ajustar el tamaño de la fuente del título
)


fig.show()
import plotly.express as px
import plotly.graph_objects as go


fig_density = px.histogram(df_compartir, x="HR", marginal="box", nbins=50, title="Densidad de Humedad Relativa Estación Compartir",
                           labels={'Temperatura Ambiente (°C)'}, color_discrete_sequence=['#30143F'])


fig_density.update_traces(
    marker=dict(color='#30143F', opacity=0.7),  # Ajustar la opacidad de las barras
    selector=dict(type='histogram')
)


fig_density.update_layout(
    xaxis_title="Humedad Relativa(%)",
    yaxis_title="Frecuencia",
    showlegend=False
)


fig_density.show()
import plotly.graph_objects as go
import pandas as pd

# Crear una lista única de años para el eje x
años = sorted(df_compartir['Año'].unique())

# Definir los colores para cada año
colores_años = ['#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f', '#d98e31', 
                '#e69c24', '#f2aa1c', '#f5b512', '#f8b902', '#f8b902', '#f8b902']  


figbox = go.Figure()

# Añadir trazas manualmente para cada año con colores específicos
for i, año in enumerate(años):
    df_subset = df_compartir[df_compartir['Año'] == año]
    figbox.add_trace(go.Box(
        y=df_subset['HR'],
        name=str(año),
        marker_color=colores_años[i % len(colores_años)]  # Asignar un color específico a cada año
    ))


figbox.update_layout(
    title="Distribución de Humedad Relativa por Año",
    xaxis_title="Año",
    yaxis_title="Humedad Relativa (%)",
    title_x=0.5,  # Centrar el título
    xaxis=dict(
        title="Año",
        tickmode='array',
        tickvals=años,  # Asegurar que todos los años se muestran
        ticktext=[str(año) for año in años]  # Etiquetas para cada año
    )
)


figbox.show()
import plotly.graph_objects as go
import pandas as pd

# Definir el orden correcto de los meses en español
orden_meses = ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio",
               "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"]

# Crear un diccionario para mapear números de mes a nombres en español
nombres_meses = {i+1: mes for i, mes in enumerate(orden_meses)}

# Crear un diccionario para mapear nombres de mes a números
mes_a_numero = {mes: i+1 for i, mes in enumerate(orden_meses)}

# Definir una lista de colores para los meses
colores_meses = ['#30143F', '#432c4d', '#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f', '#d98e31', '#e69c24', '#f2aa1c', '#f5b512', '#f8b902']



# Crear una columna adicional para el mes basado en la fecha
df_compartir['Mes'] = df_compartir['fecha'].dt.month.map(nombres_meses)

# Mapear los nombres de los meses a números para ordenar
df_compartir['Mes_Num'] = df_compartir['Mes'].map(mes_a_numero)

# Crear una figura usando plotly.graph_objects
figbox = go.Figure()


for mes, color in zip(orden_meses, colores_meses):
    df_subset = df_compartir[df_compartir['Mes'] == mes]
    figbox.add_trace(go.Box(
        y=df_subset['HR'],
        name=mes,
        marker_color=color
    ))


figbox.update_layout(
    title="Distribución de Humedad Relativa Mensual",
    xaxis_title="Mes",
    yaxis_title="Humedad Relativa (%)",
    title_x=0.5,  # Centrar el título
    xaxis=dict(
        tickmode='array',
        tickvals=orden_meses, 
        ticktext=orden_meses, 
        categoryorder='array',  # Ordenar los meses en el orden especificado
        categoryarray=orden_meses  # Especificar el orden de los meses
    )
)


figbox.show()
import plotly.graph_objects as go
import pandas as pd

# Definir el orden correcto de los días de la semana en español
orden_dias = ["Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo"]

# Crear un diccionario para mapear números de día de la semana a nombres en español
nombres_dias = {i: dia for i, dia in enumerate(orden_dias, start=0)}

# Crear un diccionario para mapear nombres de días a números
dia_a_numero = {dia: i for i, dia in enumerate(orden_dias)}

# Definir una lista de colores para los días de la semana
colores_dias = ['#30143F', '#432c4d', '#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f']


# Crear una columna adicional para el día de la semana basado en la fecha
df_compartir['Día'] = df_compartir['fecha'].dt.day_name().map(lambda x: {
    'Monday': 'Lunes', 'Tuesday': 'Martes', 'Wednesday': 'Miércoles',
    'Thursday': 'Jueves', 'Friday': 'Viernes', 'Saturday': 'Sábado', 'Sunday': 'Domingo'
}[x])

# Mapear los nombres de los días a números para ordenar
df_compartir['Día_Num'] = df_compartir['Día'].map(dia_a_numero)


figbox = go.Figure()

# Añadir trazas para cada día de la semana con colores distintos
for dia, color in zip(orden_dias, colores_dias):
    df_subset = df_compartir[df_compartir['Día'] == dia]
    figbox.add_trace(go.Box(
        y=df_subset['HR'],
        name=dia,
        marker_color=color
    ))


figbox.update_layout(
    title="Distribución Humedad Relativa por Día de la Semana",
    xaxis_title="Día de la Semana",
    yaxis_title="Humedad Relativa (%)",
    title_x=0.5,  
    xaxis=dict(
        tickmode='array',
        tickvals=orden_dias, 
        ticktext=orden_dias,  
        categoryorder='array',  # Ordenar los días en el orden especificado
        categoryarray=orden_dias  # Especificar el orden de los días de la semana
    )
)

figbox.show()
import plotly.graph_objects as go
import pandas as pd

# Definir el orden correcto de las horas del día
orden_horas = [f"{i:02d}:00" for i in range(24)]

# Crear un diccionario para mapear números de hora a nombres
horas_a_numero = {f"{i:02d}:00": i for i in range(24)}

# Definir una lista de colores para las horas del día
colores_horas = ['#30143F', '#432c4d', '#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f', 
                 '#d98e31', '#e69c24', '#f2aa1c', '#f5b512', '#f8b902', '#f8d024', '#f4c433', 
                 '#f0b838', '#d8a73d', '#c09d42', '#a9914f', '#8c8e5a', '#6d8a65', '#51776c', 
                 '#356d6f', '#1e616c', '#115f6a', '#006f6f']


# Crear una columna adicional para la hora basada en la fecha
df_compartir['Hora'] = df_compartir['fecha'].dt.hour.map(lambda x: f"{x:02d}:00")

# Mapear las horas a números para ordenar
df_compartir['Hora_Num'] = df_compartir['Hora'].map(horas_a_numero)

figbox = go.Figure()

# Añadir trazas para cada hora con colores distintos
for hora, color in zip(orden_horas, colores_horas):
    df_subset = df_compartir[df_compartir['Hora'] == hora]
    figbox.add_trace(go.Box(
        y=df_subset['HR'],
        name=hora,
        marker_color=color
    ))

# Actualizar el diseño del gráfico
figbox.update_layout(
    title="Distribución de Humedad Relativa por Hora del Día",
    xaxis_title="Hora del Día",
    yaxis_title="Humedad Relativa(%)",
    title_x=0.5,  # Centrar el título
    xaxis=dict(
        tickmode='array',
        tickvals=orden_horas,  
        ticktext=orden_horas,  
        categoryorder='array',  # Ordenar las horas en el orden especificado
        categoryarray=orden_horas  # Especificar el orden de las horas
    )
)

figbox.show()

En relación con los gráficos analizados, se observa una tendencia consistente en la humedad relativa (%) al segmentar los datos por año, mes y día de la semana. Sin embargo, al examinar las horas del día, se identifica una tendencia inversa en las mediciones de humedad relativa (%) en contraste con la temepratura ambiente (°C).

Ozono (O3) #

import plotly.graph_objects as go


fig = go.Figure()

fig.add_trace(go.Scatter(
    x=df_compartir['fecha'],
    y=df_compartir['O3'],
    mode='lines',  # Mostrar la línea
    line=dict(color='#30143F'),  # Cambiar el color de la línea
    name='Ozono (µg/m³)',
    opacity=0.7  # Ajustar la opacidad de la línea (0.0 es completamente transparente, 1.0 es completamente opaco)
))


fig.update_layout(
    title='Ozono a lo Largo del Tiempo',
    xaxis_title='Fecha',
    yaxis_title='Ozono (µg/m³)',  
    xaxis=dict(tickangle=45, tickformat='%Y-%m-%d'),
    yaxis=dict(tickformat='.1f'),  # Formato de los ticks del eje Y (un decimal)
    template='plotly_white',  # Fondo blanco 
    title_x=0.5,  # Centrar el título
    title_font=dict(size=16)  # Ajustar el tamaño de la fuente del título
)


fig.show()
import plotly.express as px
import plotly.graph_objects as go


fig_density = px.histogram(df_compartir, x="O3", marginal="box", nbins=50, title="Densidad de Ozono Estación Compartir",
                           labels={'Ozono (µg/m³)'}, color_discrete_sequence=['#30143F'])


fig_density.update_traces(
    marker=dict(color='#30143F', opacity=0.7),  # Ajustar la opacidad de las barras
    selector=dict(type='histogram')
)


fig_density.update_layout(
    xaxis_title="Ozono (µg/m³)",
    yaxis_title="Frecuencia",
    showlegend=False
)


fig_density.show()
import plotly.graph_objects as go
import pandas as pd

# Crear una lista única de años para el eje x
años = sorted(df_compartir['Año'].unique())

# Definir los colores para cada año
colores_años = ['#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f', '#d98e31', 
                '#e69c24', '#f2aa1c', '#f5b512', '#f8b902', '#f8b902', '#f8b902']  


figbox = go.Figure()

# Añadir trazas manualmente para cada año con colores específicos
for i, año in enumerate(años):
    df_subset = df_compartir[df_compartir['Año'] == año]
    figbox.add_trace(go.Box(
        y=df_subset['O3'],
        name=str(año),
        marker_color=colores_años[i % len(colores_años)]  # Asignar un color específico a cada año
    ))

# Actualizar el diseño del gráfico
figbox.update_layout(
    title="Distribución de Ozono por Año",
    xaxis_title="Año",
    yaxis_title="Ozono (µg/m³)",
    title_x=0.5,  # Centrar el título
    xaxis=dict(
        title="Año",
        tickmode='array',
        tickvals=años,  # Asegurar que todos los años se muestran
        ticktext=[str(año) for año in años]  # Etiquetas para cada año
    )
)

figbox.show()
import plotly.graph_objects as go
import pandas as pd

# Definir el orden correcto de los meses en español
orden_meses = ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio",
               "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"]

# Crear un diccionario para mapear números de mes a nombres en español
nombres_meses = {i+1: mes for i, mes in enumerate(orden_meses)}

# Crear un diccionario para mapear nombres de mes a números
mes_a_numero = {mes: i+1 for i, mes in enumerate(orden_meses)}

# Definir una lista de colores para los meses
colores_meses = ['#30143F', '#432c4d', '#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f', '#d98e31', '#e69c24', '#f2aa1c', '#f5b512', '#f8b902']


# Crear una columna adicional para el mes basado en la fecha
df_compartir['Mes'] = df_compartir['fecha'].dt.month.map(nombres_meses)

# Mapear los nombres de los meses a números para ordenar
df_compartir['Mes_Num'] = df_compartir['Mes'].map(mes_a_numero)

# Crear una figura usando plotly.graph_objects
figbox = go.Figure()

# Añadir trazas para cada mes con colores distintos
for mes, color in zip(orden_meses, colores_meses):
    df_subset = df_compartir[df_compartir['Mes'] == mes]
    figbox.add_trace(go.Box(
        y=df_subset['O3'],
        name=mes,
        marker_color=color
    ))

# Actualizar el diseño del gráfico
figbox.update_layout(
    title="Distribución de Ozono Mensual",
    xaxis_title="Mes",
    yaxis_title="Ozono (µg/m³)",
    title_x=0.5,  # Centrar el título
    xaxis=dict(
        tickmode='array',
        tickvals=orden_meses, 
        ticktext=orden_meses, 
        categoryorder='array',  # Ordenar los meses en el orden especificado
        categoryarray=orden_meses  # Especificar el orden de los meses
    )
)


figbox.show()
import plotly.graph_objects as go
import pandas as pd

# Definir el orden correcto de los días de la semana en español
orden_dias = ["Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo"]

# Crear un diccionario para mapear números de día de la semana a nombres en español
nombres_dias = {i: dia for i, dia in enumerate(orden_dias, start=0)}

# Crear un diccionario para mapear nombres de días a números
dia_a_numero = {dia: i for i, dia in enumerate(orden_dias)}

# Definir una lista de colores para los días de la semana
colores_dias = ['#30143F', '#432c4d', '#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f']


# Crear una columna adicional para el día de la semana basado en la fecha
df_compartir['Día'] = df_compartir['fecha'].dt.day_name().map(lambda x: {
    'Monday': 'Lunes', 'Tuesday': 'Martes', 'Wednesday': 'Miércoles',
    'Thursday': 'Jueves', 'Friday': 'Viernes', 'Saturday': 'Sábado', 'Sunday': 'Domingo'
}[x])

# Mapear los nombres de los días a números para ordenar
df_compartir['Día_Num'] = df_compartir['Día'].map(dia_a_numero)

# Crear una figura usando plotly.graph_objects
figbox = go.Figure()

# Añadir trazas para cada día de la semana con colores distintos
for dia, color in zip(orden_dias, colores_dias):
    df_subset = df_compartir[df_compartir['Día'] == dia]
    figbox.add_trace(go.Box(
        y=df_subset['O3'],
        name=dia,
        marker_color=color
    ))

# Actualizar el diseño del gráfico
figbox.update_layout(
    title="Distribución Ozona por Día de la Semana",
    xaxis_title="Día de la Semana",
    yaxis_title="Ozono (µg/m³)",
    title_x=0.5,  # Centrar el título
    xaxis=dict(
        tickmode='array',
        tickvals=orden_dias,  
        ticktext=orden_dias,  
        categoryorder='array',  # Ordenar los días en el orden especificado
        categoryarray=orden_dias  # Especificar el orden de los días de la semana
    )
)


figbox.show()
import plotly.graph_objects as go
import pandas as pd

# Definir el orden correcto de las horas del día
orden_horas = [f"{i:02d}:00" for i in range(24)]

# Crear un diccionario para mapear números de hora a nombres
horas_a_numero = {f"{i:02d}:00": i for i in range(24)}

# Definir una lista de colores para las horas del día
colores_horas = ['#30143F', '#432c4d', '#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f', 
                 '#d98e31', '#e69c24', '#f2aa1c', '#f5b512', '#f8b902', '#f8d024', '#f4c433', 
                 '#f0b838', '#d8a73d', '#c09d42', '#a9914f', '#8c8e5a', '#6d8a65', '#51776c', 
                 '#356d6f', '#1e616c', '#115f6a', '#006f6f']


# Crear una columna adicional para la hora basada en la fecha
df_compartir['Hora'] = df_compartir['fecha'].dt.hour.map(lambda x: f"{x:02d}:00")

# Mapear las horas a números para ordenar
df_compartir['Hora_Num'] = df_compartir['Hora'].map(horas_a_numero)

# Crear una figura usando plotly.graph_objects
figbox = go.Figure()

# Añadir trazas para cada hora con colores distintos
for hora, color in zip(orden_horas, colores_horas):
    df_subset = df_compartir[df_compartir['Hora'] == hora]
    figbox.add_trace(go.Box(
        y=df_subset['O3'],
        name=hora,
        marker_color=color
    ))

# Actualizar el diseño del gráfico
figbox.update_layout(
    title="Distribución de Ozono por Hora del Día",
    xaxis_title="Hora del Día",
    yaxis_title="Ozono (µg/m³)",
    title_x=0.5,  # Centrar el título
    xaxis=dict(
        tickmode='array',
        tickvals=orden_horas,  
        ticktext=orden_horas, 
        categoryorder='array',  # Ordenar las horas en el orden especificado
        categoryarray=orden_horas  # Especificar el orden de las horas
    )
)


figbox.show()

En relación con los gráficos analizados, se observa una tendencia consistente en la concentración de Ozono (µg/m³) al segmentar los datos por año, mes y día de la semana. Sin embargo, al examinar las horas del día, se identifica que entre las 8 a.m. y 6 p.m., la mediana de la concentración de ozono muestra un incremento comparado con otras horas, con una mayor dispersión en los datos entre las 9 a.m y 5 p.m. A partir de las 3 p.m., la concentración de ozono muestran una leve disminución hasta las 6 p.m., posterior a ésta hora la temperatura se mantiene relativamente constantes hasta aproximadamente las 6 a.m. del siguiente día. En contraste con la temperatura ambiente tienen el mismo comportamiento.